Skip to content
0

Git - 常用命令 ​

NOTE

下面我们学习 Git 在本地常用的命令,也是开发经常用到的命令。

2022-02-08 @Young Kbt

Git常用命令 ​

本地命令 ​

命令名称作用
git config --global user.name 用户名设置用户签名
git config --global user.email 邮箱设置用户签名
git init初始化本地库
git status查看本地库状态
git add 文件名(-A 代表目录及子目录下所有文件名)添加到暂存区
git commit -m "日志信息" [文件名](不加文件名,默认所有文件都添加该日志信息)添加到本地库
git reflog查看历史记录(简要)
git log查看历史记录(详细)
git log --pretty=oneline一行显示一个版本信息(版本号完整)
git log --oneline一行显示一个版本信息(版本号简写)
git reset --hard 版本号版本穿梭、跳转
git diff [文件名]比较工作区中和暂存区的文件
git diff [本地库中历史版本] [文件名]比较工作区中的文件和本地库历史记录
git branch 分支名创建分支
git branch -D 分支名删除分支
git branch -m 新的分支名将当前分支名改为新的分支名
git branch -v查看分支
git checkout 分支名切换分支
git merge 分支名合并分支

远程命令 ​

命令名称作用
git remote -v查看当前所有远程地址别名
git remote add 别名 远程地址起别名
git push 别名 分支推送本地分支上的内容到远程仓库
git clone 远程地址将远程仓库的内容克隆到本地
git pull 远程库地址别名 远程分支名将远程仓库对于分支最新内容拉下来后与 当前本地分支直接合并

如果 git push 不加别名和分支,默认别名是 origin,分支是 master。

我们 clone 项目会自动做如下操作:

  • 拉取代码
  • 初始化本地仓库
  • 创建别名,默认是 origin

具体看 Git - SSH免密登录。

设置用户签名 ​

项目级别/仓库级别 ​

仅在当前本地库范围内有效。

sh
git config user.name 用户名
git config user.email 邮箱

信息保存位置:./.git/config 文件里。

系统用户级别 ​

登录当前操作系统的用户范围。

sh
git config --global user.name 用户名
git config --global user.email 邮箱

image-20220208133344605

信息保存位置:设置了用户签名,会在用户盘下生成 .gitconfig 文件,里面也可以直接修改自己的信息。

级别优先级 ​

  • 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名

  • 如果只有系统用户级别的签名,就以系统用户级别的签名为准

  • 二者都没有不允许

说明 ​

签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。

邮箱可以是虚拟邮箱,Git 不会去识别。

注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。

初始化本地库 ​

基本语法:

sh
git init

该指令会将目录下的所有子目录以及文件交给 Git 管理,也是我们使用 Git 最重要的一步。

执行该指令后,会在当前目录下生成 .git 目录,该目录默认是隐藏的。

注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。

查看本地库状态 ​

查看工作区、暂存区状态。

基本语法:

sh
git status

image-20220208134440861

可以看到,我删除了 3 个文件,还没有放到暂存区(红色),存到了暂存区(绿色),存到了本地库(消失)。

文件增删改操作 ​

删除暂存区的文件 ​

sh
git rm --cached 文件名

添加文件到暂存区 ​

sh
git add 文件名
git add -A  # -A 代表全名文件

提交文件到本地库 ​

sh
git commit -m "日志信息" [文件名] # 文件名可不写

历史版本操作 ​

查看历史版本 ​

sh
git log   # 查看详细版本信息
git reflog  # 查看简要版本信息
git log --pretty=oneline  # 一行显示一个版本信息(版本号完整)
git log --oneline  # 一行显示一个版本信息(版本号简写)

多屏显示控制方式:

  • 空格向下翻页

  • b 向上翻页

  • q 退出

切换历史版本 ​

  • 基于索引值操作[推荐]

    sh
    git reset --hard [局部索引值]
    git reset --hard a6ace91   # 例子
  • 使用 ^ 符号:只能后退

    sh
    git reset --hard HEAD^

    注:一个 ^ 表示后退一步,n 个表示后退。

  • 使用 ~ 符号:只能后退

    sh
    git reset --hard HEAD~n

    注:表示后退 n 步。

  • 使用 HEAD 符号,恢复当前提交本地库的版本

    git reset --hard HEAD

    注:在当前版本中删除了某个文件,可以恢复到当前最初的版本。

reset 命令的三个参数对比

  • --soft 参数

    • 仅仅在本地库移动 HEAD 指针
  • --mixed 参数

    • 在本地库移动 HEAD 指针
    • 重置暂存区
  • --hard 参数

    • 在本地库移动 HEAD 指针
    • 重置暂存区
    • 重置工作区

比较文件操作 ​

将工作区中的文件和暂存区进行比较

sh
git diff [文件名]

将工作区中的文件和本地库历史记录比较

sh
git diff [本地库中历史版本] [文件名]

不带文件名则比较多个文件。

如果 [本地库中历史版本] 是 HEAD,则比较当前版本。

分支操作 ​

image-20220208142253151

什么是分支? ​

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)

image-20220208142308410

分支的好处? ​

同时并行推进多个功能开发,提高开发效率。

各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

分支操作 ​

命令名称作用
git branch 分支名创建分支
git branch -D 分支名删除分支
git branch -m 新的分支名将当前分支名改为新的分支名
git branch -v查看分支
git checkout 分支名切换分支
git merge 分支名合并分支

创建分支

sh
git branch [分支名]

删除分支

sh
git branch -D 分支名

将当前分支名改为新的分支名

git branch -m 新的分支名

查看分支

sh
git branch -v

切换分支

sh
git checkout [分支名]

合并分支

  • 第一步:切换到接受修改的分支(被合并,增加新内容)上

    sh
    git checkout [被合并的分支名]
  • 第二步:执行 merge 命令

    sh
    git merge [有新内容的分支名]

分支冲突 ​

产生冲突

冲突的表现:后面状态为 MERGING

image-20220208140823758

冲突产生的原因:合并分支时,两个分支在 同一个文件的同一个位置 有两套完全不同的修改。Git 无法替 我们决定使用哪一个。必须 人为决定 新代码内容。

冲突如图(修改的是同一个位置):

image-20220208152143419

解决冲突

冲突的解决:

  • 第一步:编辑文件,删除特殊符号

  • 第二步:把文件修改到满意的程度,保存退出

  • 第三步:添加到暂存区,git add [文件名]

  • 第四步:执行提交,git commit -m "日志信息"(注意:此时 commit 一定不能带具体文件名)

创建分支和切换分支图解 ​

image-20220208142934045

master、hot-fix 其实都是指向具体版本记录的指针。当前所在的分支,其实是由 HEAD 决定的。所以创建分支的本质就是多创建一个指针。

HEAD 如果指向 master,那么我们现在就在 master 分支上。

HEAD 如果执行 hotfix,那么我们现在就在 hotfix 分支上。

分支进阶操作 ​

删除所有记录 ​

想清空所有 commit 的信息记录,就像形成一个全新的仓库,且代码不变。

  1. 先切换到新的分支

    sh
    git branch kele
    git checkout kele
  2. 添加所有文件到暂存区(除了 .gitignore 中排除的)

    sh
    git add -A
  3. 提交跟踪过的文件到本地库

    sh
    git commit -am "commit message"
  4. 删除 master 分支

    sh
    git branch -D master
  5. 重命名当前分支为 master

    sh
    git branch -m master
  6. 提交到远程 master 分支

    sh
    git push -f origin master

删除上次记录 ​

如果只是想修改上次提交的代码,做一次更完美的 commit,可以这样:

  1. 回到到上个版本(注:不要带 --hard)

    sh
    git reset commitId
  2. 暂存修改

    sh
    git stash
  3. 强制 push,这样远程的最新的一次 commit 被删除

    git push --force
  4. 释放暂存的修改,开始修改代码

    sh
    git stash pop
  5. 添加、推送

    sh
    git add
    git commit -m "massage"
    git push

同时修改本地分支名和对应的远程分支名 ​

修改前要确保本地分支的代码是最新的,并且修改后不会影响到同事的代码。

  1. 修改本地分支名
sh
git branch -m oldBranchName newBranchName
  1. 删除远程分支
sh
git push origin :oldBranchName
  1. 改名后的本地分支推送到远程
sh
git push --set-upstream origin newBranchName
最近更新